package com.example.springboottest.example.atomic;

import com.example.springboottest.example.equals.Stu;
import com.example.springboottest.util.Print;

import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.concurrent.atomic.AtomicReference;

/**
 * 使用原子引用类型AtomicReference包装了User对象之后，只能保障 User引用的原子操作，
 * 对被包装的User对象的字段值修改时不能保证原子性，这点要切记。
 * 如果想保证字段级别的原子性，需要用到AtomicIntegerFieldUpdater
 * <p>
 * age属性必须设置为 public volatile int age;才行
 */
public class AtomicStuIntegerUpdaterTest {
    public static void main(String[] args) {
        //调用静态方法newUpdater()创建一个更新器updater
        AtomicIntegerFieldUpdater<Stu> updater = AtomicIntegerFieldUpdater.newUpdater(Stu.class, "age");
        Stu user = new Stu("张三", 1);
        //使用属性更新器的getAndIncrement、getAndAdd增加user的age值
        Print.tco(updater.getAndIncrement(user));  // 1
        Print.tco(updater.getAndAdd(user, 100)); // 101
        // 使用属性更新器的get获取user的age值
        Print.tco(updater.get(user));// 101
    }
}